#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "XPT2046.h"
#include "MatrixKey.h"

#include "Nixie.h"
#include "Buzzer.h"
#include "UART.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int syscount;

xdata char sbuff1[32];
xdata char sbuff2[32];

unsigned char ADValue;
float adcvalue,upvalue,lowvalue;
unsigned char ge,xiaoshu1,xiaoshu2;

unsigned char ADCtaskflag,LCDtaskflag,Nixietaskflag,UARTsendflag;
void ADC_task();
void LCD_task();
void Nixie_task();

void SysTimer1Init()//10毫秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x00;			//设置定时初值
	TH0 = 0xDC;			//设置定时初值
	PT0 = 1;
	EA=1;ET0=1;
	TF0 = 0;				//清除TF1标志
	TR0 = 1;				//定时器1开始计时
}

void main(void)
{
	LCD_Init();
	//BuzzerTimer0Init();
	LCD_ShowString(1,1,"LOW  UP");
	UART_Init();
	SysTimer1Init();

	while(1)
	{
		MatrixKey();						//采集按键键值，并计算Llimit和Hlimit

		/*使用ADC采样*/
		if (ADCtaskflag)
		{
			ADC_task();
			ADCtaskflag=0;
		}
		/*计算采样数值*/
		adcvalue=ADValue/255.0f*5.0f;
		upvalue=((unsigned char)getHlimit())/255.0f*5.0f;
		lowvalue=((unsigned char)getLlimit())/255.0f*5.0f;
		/*串口发送*/
		if(UARTsendflag)
		{
			UART_SendByte(ADValue);
			UARTsendflag=0;
		}
		/*使用LCD1602显示*/
		if(LCDtaskflag)
		{
			EA=0;		//关中断，下面两行代码执行比较耗时，如果被中断打断执行可能会导致LCD显示乱码
			LCD_task();
			EA=1;
			LCDtaskflag=0;
		}
		/*使用数码管显示*/
		if(Nixietaskflag)
		{
			Nixie_task();
			Delay(20);
			Nixietaskflag=0;
		}

		//如果电压超出阈值,打开蜂鸣器
		if((lowvalue >= adcvalue) || (upvalue <= adcvalue))
		{
			Buzzer_Time(5);
		}

	}
}

void Timer1_Routine() interrupt 1
{
	P1_5=~P1_5;//用于外部测试定时器定时时间
	syscount++;
	
	if(syscount%1==0) Nixietaskflag=1;
	if(syscount%50==0) ADCtaskflag=1;
	if(syscount%100==0) UARTsendflag=1;
	if(syscount%100==0) LCDtaskflag=1;;
	
	TL0 = 0x00;		//设置定时初值
	TH0 = 0xDC;		//设置定时初值
	
}

void ADC_task()
{
		ADValue=XPT2046_ReadAD(XPT2046_XP);		//读取AIN0，可调电阻
}
void LCD_task()
{
		sprintf(sbuff1,"%1.2f %1.2f",lowvalue,upvalue);
		LCD_ShowString(2,1,sbuff1);
}
void Nixie_task()
{
		ge=(int)adcvalue;											//将采样得到的数各个位提取出来
		xiaoshu1=((int)(adcvalue*10)%10);
		xiaoshu2=((int)(adcvalue*100)%10);

		Nixie(1,ge,1);												//数码管显示
		Nixie(2,xiaoshu1,0);
		Nixie(3,xiaoshu2,0);
}